//
//  YKNode.h
//  ProjectM
//
//  Created by gaofeng on 2021/4/17.
//  结构体中引用自生的类型时需要使用指针，不然就会形成死循环，无法确定类型大小。
//  函数结束，结构体变量会被回收，因为是系统分配的内存，想要长期保存需要使用malloc手动分配
// 【UP从0到1带你手撕数据结构全集(C语言版)-哔哩哔哩】https://b23.tv/FHgzGZ
#ifndef YKNode_h
#define YKNode_h
#include "PrefixHeader.pch"
int nodeMain(void);
/** 推荐使用
 * 初始化链表头节点
 */
YKList creatList(void);
void headInsert(YKList lh,int data);
void trailInsert(YKList lh,int data);
int  deletNode(YKList L,int data);
/** 倒插法 带头节点链表
 * 通过数组创建链表
 */
YKList creatListe(int a[],int len);
/** 头插法 不带头节点
 *
 */
YKList creatListb(int a[],int len);
YKList creatListHeadNode(int a[],int len);

// 删除带头节点链表中元素为ele的所有节点
void deletElemHeadList(YKList lh,int ele);
YKList deletElemHeadListA (YKList lh,int ele);
YKList deletElemte(YKList lt,int ele);
void deletElemtea(YKList *lt,int ele);
void deletElemteb(YKList *lt,int ele);
void deletElemtec(YKNode *lt,int ele);

void printList(YKList ll);

void printNodes(YKNode nd);
/** 翻转链表
 * 方法一 将所有节点存入数组中，通过逆袭访问数组实现翻转
 * 方法二
 */
YKList overturnList(YKList lt);
// 双指针法 空间复杂度为1，对带头结点的，需要稍微修改
YKList overturnListB(YKList lt);
#endif /* YKNode_h */
